home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Gold Collection / Software Vault - The Gold Collection (American Databankers) (1993).ISO / cdr49 / 226_01.zip / WORKUP3.C < prev    next >
Text File  |  1993-04-21  |  7KB  |  232 lines

  1.    /*  HEADER:CUG 226;
  2.        TITLE:"ART-CEE";
  3.        VERSION:1.4;
  4.        DESCRIPTION:"Small artificial intelligence inference engine.
  5.  
  6.             ART-CEE is a rule-based general purpose driver capable of working
  7.             with heirarchical and/or propositional information.";
  8.        KEYWORDS:artificial intelligence, inference engines, database;
  9.        SYSTEM:MS-DOS;
  10.        FILENAME:WORKUP3.C;
  11.        SEE-ALSO:WORKUP0.C, WORKUP2.C, WORKUP4.C, MANUAL.TXT, WORKUP0.H,
  12.             WORKUP1.H, HELP1.AIH, HELP2.AIH, HELP3.AIH, HELP4.AIH, ART-CEE.COM;
  13.        AUTHOR:Dan Cheatham;
  14.        COMPILER:MIX-C;
  15.    */
  16.  
  17.  
  18.          /*  art-cee  artificial intelligence inference engine    */
  19.          /*                                                       */
  20.          /*  file:  workup3.c    --  thinking                     */
  21.          /*                                                       */
  22.  
  23. #include "workup0.h"
  24. #include "workup1.h"
  25.  
  26.     static int currsub[MAX], currpred[MAX], instant[MAX], s1, q4, ll4;
  27.  
  28. fullques(rr1,rr2)
  29.    int rr1, rr2;
  30.    { int wk3;
  31.      if (ft[rr1][rr2] > 0)
  32.        { ff1 = ft[rr1][rr2];
  33.          statecon(rr1,rr2,0);}
  34.      else
  35.        { if (ft[rr1][rr2] < 0)
  36.             stateimp(rr1,rr2,0);
  37.          else
  38.               queryloop(rr1,rr2); }
  39.    marktime();
  40. }
  41.  
  42. statecon(rw1,rw2,rw3)
  43.     int rw1, rw2, rw3;
  44.    { printf("\nIf %s\n    then %s",subjs[rw1],subjs[rw2]);
  45.      printf("   is demonstrated with a probability of %f pct.\n",ff1);
  46.      if (rw3 > 0)
  47.          askreadd(rw1,rw2);
  48. }
  49.  
  50. askreadd(de1,de2)
  51.    int de1,de2;
  52.    { char answer[2];
  53.      printf("\nShall this fact be added to database (Y/N)? ");
  54.      gets(answer);
  55.      if (toupper(answer[0]) == 'Y')
  56.         { ft[de1][de2] = ff1;
  57.           printf("\nNew learning added.");}
  58. }
  59.  
  60. stateimp(rz1,rz2,rz3)
  61.    int rz1, rz2, rz3;
  62.    { printf("\nIf %s\n   then %s",subjs[rz1],subjs[rz2]);
  63.      printf("\n    cannot be, given present knowledge.");
  64.      if (rz3 > 0)
  65.         { ff1 = -100; askreadd(rz1,rz2,ff1); }
  66. }
  67.  
  68. queryloop(q1,q2)
  69.    int q1, q2;
  70.    { int q3, q5, q6;     char dumment[2];
  71.      q4 = MAX - 1; ll4 = q4;
  72.      for (q3 = 0; q3 < MAX; q3++)
  73.        { currsub[q3] = 0;
  74.          currpred[q3] = 0;
  75.          instant[q3] = 0; }
  76.      currsub[0] = q1;
  77.      s1 = 0;
  78.      instant[0] = 1;
  79.      q6 = cntinfer();
  80.      while(currpred[0] < MAX)
  81.         { if (ft[currsub[s1]][currpred[s1]]  >= 0 && q6 <= assumpno &&
  82.            ft[currsub[0]][currpred[s1]] >= 0 &&
  83.               subjs[currpred[s1]][0] != '@')
  84.            { if (currpred[s1] == q2)
  85.               {drawconc(q1,q2); moveback();}
  86.              else
  87.                 movenext(); }
  88.           else
  89.              moveback();
  90.           q6 = cntinfer();}
  91. }
  92.  
  93. cntinfer()
  94.    { int cr1, cr2;
  95.      cr2 = 0;
  96.      for (cr1 = 0; cr1 <= s1; cr1++)
  97.        { if (ft[currsub[cr1]][currpred[cr1]] == 0)
  98.             cr2++;}
  99.      return(cr2);
  100. }
  101.  
  102. movenext()
  103.   { int mn1, mn2;
  104.     if (s1 < q4)
  105.       { mn1 = s1;  s1++;
  106.         currsub[s1] = currpred[mn1];
  107.         currpred[s1] = 0;
  108.         mn2 = checkdups();
  109.         if (mn2 != 0)
  110.             { currpred[s1] = ll4; moveback(); }
  111.         else
  112.             {}}
  113.     else
  114.         moveback();
  115. }
  116.  
  117. checkdups()
  118.   { int cd1, cd2;
  119.     cd2 = 0;
  120.     for (cd1 = 0; cd1 < s1; cd1++)
  121.       { if (currsub[cd1] == currsub[s1])
  122.            cd2 = 1; }
  123.     return(cd2);
  124. }
  125.  
  126. moveback()
  127.   { int mb1, mb2, mb3;
  128.     if (s1 == 0)
  129.        { if (currpred[0] == ll4)
  130.            currpred[0] = MAX;
  131.          else
  132.            currpred[0]++; }
  133.     else
  134.        { if (s1 == q4 || currpred[s1] == ll4)
  135.             { s1--; moveback(); }
  136.          else
  137.             currpred[s1]++; }
  138. }
  139.  
  140. drawconc(cd1,cd2)
  141.    { int dc1, dc2, dc3, dc4;  char resp[2], dummystr[2];
  142.      dc1 = 1; dc2 = 0; strcpy(resp,"Y"); ff1 = 1.00;
  143.      if (s1 > 0)
  144.       {  while (dc1 == 1 && dc2 < s1)
  145.          { printf("\nIt has been given that %s , and...",subjs[currsub[dc2]]);
  146.            dc2++;
  147.            dc1 = instant[currsub[dc2]] ; }
  148.  
  149.       while (dc2 <= s1 && resp[0] == 'Y')
  150.           { instant[dc2] = 1;
  151.             printf("\n  then is it also true that...\n   %s (Y/N)? ",subjs[currsub[dc2]]);
  152.             gets(resp);
  153.             if (toupper(resp[0]) == 'Y')
  154.               { instant[currsub[dc2]] = 1; dc3 = dc2 - 1;
  155.                 if (ft[currsub[dc3]][currsub[dc2]] == 0)
  156.                   { printf("\nEnter percent of time that the following is true.");
  157.                     printf("\n  If %s",subjs[currsub[dc3]]);
  158.                     printf("\n     then %s\nPercent:  ",subjs[currsub[dc2]]);
  159.                     dc4 = scanf("%f",&ft[currsub[dc3]][currsub[dc2]]); gets(dummystr);
  160.                     if (dc4 != 1)
  161.                        ft[currsub[dc3]][currsub[dc2]] = -100;
  162.                     if (ft[currsub[dc3]][currsub[dc2]] > 100)
  163.                        ft[currsub[dc3]][currsub[dc2]] = 100;
  164.                     else
  165.                        { if (ft[currsub[dc3]][currsub[dc2]] < 0)
  166.                           { printf("\nImpossibility rejected.");
  167.                             ft[currsub[dc3]][currsub[dc2]] = 0;
  168.                             instant[currsub[dc2]] = 0;
  169.                             strcpy(resp,"N"); }}}}
  170.             else
  171.                 instant[currsub[dc2]] = 0;
  172.             dc2++;}
  173.  
  174.          if (toupper(resp[0]) == 'Y')
  175.            { for (dc1 = 0; dc1 <= s1; dc1++)
  176.                 ff1 = ff1 * (ft[currsub[dc1]][currpred[dc1]] / 100);
  177.              ff1 = 100 * ff1;
  178.  
  179.          if (ff1 > 0)
  180.            { printf("\nthen, finally, %s",subjs[currpred[s1]]);
  181.              statecon(cd1,cd2,1);}}}
  182. }
  183.  
  184. think()
  185.    { int t1, t2, t3, t4, t5;
  186.      t4 = 0;
  187.      for (t1 = 0; t1 < MAX; t1++)
  188.       { if (subjs[t1][0] != '@')
  189.         { for (t2 = 0; t2 < MAX; t2++)
  190.           { if (subjs[t2][0] != '@' && t1 != t2)
  191.             { if (ft[t1][t2] == -100)
  192.               { for (t3 = 0; t3 < MAX; t3++)
  193.                 { if (subjs[t3][0] != '@' && t1 != t3)
  194.                   { if (ft[t3][t2] == 100 && ft[t1][t3] == 0)
  195.                      { ft[t1][t3] = -100;
  196.                        t4++; }}}}}}}}
  197.       printf("\n %d logical impossibilities identified and marked.",t4);
  198.  
  199.       ll4 = MAX - 1; t3 = 0; q4 = srchdpth;
  200.   
  201.       for (t1 = 0; t1 < MAX; t1++)
  202.        { for (t2 = 0; t2 < MAX; t2++)
  203.          { currsub[t2] = 0;
  204.            currpred[t2] = 0; }
  205.          if (subjs[t1][0] != '@')
  206.            { s1 = 0; printf("\nNow analyzing references for %s",subjs[t1]);
  207.              currsub[s1] = t1;
  208.              while(currpred[0] < MAX)
  209.               { if (subjs[currpred[s1]][0] != '@'
  210.                    && ft[currsub[s1]][currpred[s1]] > 0
  211.                    && ft[currsub[0]][currpred[s1]] >= 0)
  212.                       { t3 = t3 + figpct(s1); movenext(); }
  213.                 else
  214.                    moveback();}}}
  215.       printf("\n\n %d new learnings added or updated.",t3);
  216.       marktime();
  217. }
  218.  
  219. figpct(fp1)
  220.     int fp1;
  221.     { int fp2;
  222.       if (ft[currsub[0]][currpred[fp1]] >= 0)
  223.          { ff1 = 1;
  224.            for (fp2 = 0; fp2 <= fp1; fp2++)
  225.             ff1 = ff1 * (ft[currsub[fp2]][currpred[fp2]] / 100);
  226.           ff1 = 100 * ff1;
  227.           if (ff1 > ft[currsub[0]][currpred[fp1]])
  228.              { ft[currsub[0]][currpred[fp1]] = ff1; return(1);}
  229.           else
  230.              return(0);}
  231. }
  232.